perm filename CALBOX.FAI[PUR,LCS] blob sn#430688 filedate 1979-07-23 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00012 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE TBOX
C00004 00003	   Reset and interrupt vectors.
C00006 00004	INPUT WAIT.	Check upflg time?
C00008 00005		CALL	CLED	Clear cal. and mode leds.
C00010 00006	CALJMP:	JMP	GETJSW
C00011 00007	CKJP:
C00013 00008	WLED:	OUTB	Latch A on bus.
C00015 00009	 Bit spreading table
C00018 00010	GETJSW:	MOVRI	P,P1
C00019 00011	Alfa led message table.
C00022 00012	("T"∧77)∨300 ↔ ("O"∧77)∨200 ↔ ("O"∧77)∨100
C00025 ENDMK
C⊗;
	TITLE TBOX
	.INSERT MAC748.FAI[CMS,LCS]

   ;Ram bank 0 registers.
	K ← 0
	I ← 1
	N ← 2
	T ← 3	;Timer overflow count.
	CMD ← 4	;TBOX and JS led bits.
	CMD1 ← 5	;Alfa led message index.
	OFFL ← 6	;Alfa off timer low.
	OFFH ← 7	;High.

   ;Ram10-27 = Stack.
   ;Ram bank 1 registers.
	P ← 30	;Pots pointer.
	O ← 31	;Offset pointer.
	X ← 32
	Y ← 33
	Z ← 34
	SW0 ← 35	;TBOX switch bits.
	SW1 ← 36
	SW2 ← 37

   ;Standard ram.
	SPD ← 40	;Speed pot.
	P0 ← 41	;Joy stick pots.
	P1 ← 42
	P2 ← 43
	P3 ← 44
	JW0 ← 45	;T.	Joy stick switch channels.
	JW1 ← 46	;P/O.
	JW2 ← 47	;TOOL.
	JW3 ← 50	;T/JS/C.

	OSPD ← 51	;Old speed pot.
	OP0 ← 52	;Joy stick offsets.
	OP1 ← 53
	OP2 ← 54
	OP3 ← 55
	OJSW ← 56	;Old joy stick switch bits.
	OCMD ← 57	;Old led bits.
	OCMD1 ← 60	;Old alfa led index.

	JSC ← 61	;Joy stick not calib. flag.

	XTAL ← =6000000	;In hertz.
	BRATE ← =9600	;Baud rate

;TBIT ← ((=10000000/BRATE)/((=10000000/XTAL)*=15))/2
	TBIT ← =21

	TT ← 1	;Triple throw switch port.
	S ← 2	;Scan and A/D port.
	PBL ← 4	;Push button port low.
	PBH ← 5	;Push button port high.
	CEW ← 6	;Alfa led chip enables and write port.
	JS ← 7	;Joy stick, CU, and led latch port.
   ;Reset and interrupt vectors.
	JMP	RST	;RESET VECTOR
	0
	DISXI		;EXTERNAL INTERRUPT VECTOR
	NOP
	NOP
	NOP
	DISTI		;TIMER INT VECTOR
	RETR

   ;Power on reset.
RST:	CLRA	;0 For clear cursor memory.
	OUTB	;Latch bus output.
	MOVI	377	;SETUP INPUT PORTS
	OUTP	TT	;SPTT switches.
	MOVI	77	;P4-7, SCAN, STRT, ALE.
	OUTP	S
   ;Setup PBSW ports for input.
	MOVAX	PBL	;PBSW low.
	MOVAX	PBH	;PBSW high.

   ;Clear cursor memory.
	MOVI	170	;7,,10.
	MOVAX	CEW	;Enable all alfa leds.
	SWAP	;A ← 207.
	MOVAX	JS	;Clear JS and CU.
   ;Write all alfa leds.
	ANPA	CEW	;NOT W
	CPLA
	ORPA	CEW	;W

	SWAP	;A ← 10,,7.
	ORPA	CEW	;Disable all alfa leds.
	SWAP	;A0-3 ← 10.
	ORPA	JS	;NOT CU.

	CALL	CLED	;Clear leds.
	CALL	CALED	;Clear alfa leds.

STIMER:	MOVAT		;Setup timer.
	STRTT

	CPLF1	;Set alfa leds off.
	
	JMP	SETFLG

; Set scan flag and timer
UPFLG:	DJNZ	T,CKIN
SETFLG:	MOVRI	T,4	;4 = 82 ms.
	CLRF0		;Set scan flag

	JF1S	CKIN	;Check if alfa off.
	DJNZ	OFFL,CKIN	;OFFW ← OFFW - 1.
	DJNZ	OFFH,CKIN
	CPLF1	;Set alfa led off flag.
;INPUT WAIT.	Check upflg time?
   OFFSET ← TBIT/3	;Center delay?
INWAI:	JTF	UPFLG	;Check if timer time out.

CKIN:	JT0H	INWAI	;Check for start bit.

	MOVRI	K,OFFSET-4	;Center - Itime.
CENTER:	DJNZ	K,CENTER	;Wait for center of bit
	JT0H	INWAI	;Check if valid start bit

; Byte input routine
	MOVRI	N,11	;# of bits -1

ILOOP:	MOVRI	K,TBIT-5;tBIT - tI
WAI:	DJNZ	K,WAI
	CLRC
	JT0H	BITON
	RORC
	JMP	BITOFF
BITON:	CPLC
	RORC
	NOP

BITOFF:	DJNZ	N,ILOOP

	ROLC		;Shift out stop bit
	JCC	INWAI	;Check for good stop bit.

	JBS	7,BYTE1	;Check if first or second byte.

	MOVAR	CMD	;Save first input byte.
	JMP	INWAI	;Get next byte.

BYTE1:	MOVAR	CMD1	;Save second byte.

	CLRA	;SPD default.
	JT1H	ADZRO	;Speed off.

   ;A/DCHAN ← SPEED.
	OUTB	;Latch zero on bus.
	ORPI	S,200	;ALE.
	ANPI	S,177	;NOT ALE.

	CALL	CONVRT	;Wait for speed.

	JNZ	ADZRO	;Check if on and zero.
	INCA	;A ← 1.

ADZRO:	MOVRI	K,SPD	;Save speed pot value.
	MOVAM	K
	CALL	CLED	;Clear cal. and mode leds.
	MOVRA	CMD	;Get mode code.
	RORC	;Get cal. bit.
	ANI	7	;Zero data input to LS259.
	CALL	WLED	;Write mode led.

	JCC	CKJOY	;No calib. bit.
	CLRA	;Led 0.
	CALL	WLED	;Write cal. led.

CKJOY:
GPOTS:	

;A/D convert routines.
	MOVI	1	;Chanel 1.
	OUTB	;Latch bus output.
	ORPI	S,200	;ALE
	ANPI	S,177	;NOT ALE.

	MOVRI	P,P0	;JS pot index.
	MOVRI	N,10	;# of pots + switch channels.

ADLOOP:	MOVI	370
	ANPA	JS
	MOVRA	N
	DECA
	ORPA	JS
	CALL	CONVRT	;Wait for A/D.
	MOVAM	P	;Ram(p) ← Pots&sws(p).

	INCR	P	;Next pot.
	DJNZ	N,ADLOOP	;Next channel.

;Check for scan flag.
CKSCAN:	JF0S	CALJMP	;Scan flag.

	JMP	SCAN	;Scan switches.
CALJMP:	JMP	GETJSW
CKJSC:

;Activity check.
CKACT:	MOVRI	K,OCMD
	MOVMA	K
	XORR	CMD	;A ← CMD .XOR. OCMD.
	JNZ	ACT
	MOVRI	K,OCMD1	;Old alfa index.
	MOVMA	K
	XORR	CMD1
	JNZ	ACT

	SRB1	;Select ram bank 1.
	MOVRA	SW0
	JNZ	RACT
	MOVRA	SW1
	JNZ	RACT
	MOVRA	SW2
	ANI	77	;Mask out JS and P/O bits.
	JNZ	RACT

	MOVRI	P,SPD	;Now pot index.
	MOVRI	O,OSPD	;Old pot index.
	MOVMA	P	;Check speed.
	XORM	O
	JZ	CKJP

RACT:	SRB0	;Select ram bank 0.
ACT:	JMP	ACTIVE
CKJP:
	SRB0	;Select ram bank 0.
	CLRA	;Blank message index.
	JF1S	ADPY	;Check if alfa off.
	JMP	OBITS	;Not active.

RSTRAM:	SRB0	;Select ram bank 0.
ACTIVE:	MOVRA	CMD	;OLD ← NEW.
	MOVRI	K,OCMD
	MOVAM	K	;OCMD.
	MOVRA	CMD1
	INCR	K
	MOVAM	K	;OCMD1.

	MOVRI	P,SPD
	MOVRI	O,OSPD
	MOVMA	P	;A ← SPD.
	MOVAM	O	;OSPD ← A.

	CLRF1	;Alfa led off flag ← 0.
	MOVRI	OFFH,10	;OFFW ← tOWAIT.

	MOVRA	CMD1	;Update alfa leds.
	SWAP	;Shift etc.
	ANI	360	;For 16 messages.
ADPY:	CALL	OALFA	;Output message.

OBITS:	MOVRI	CMD1,0	;Init check sum.
	MOVRI	I,SW0	;Point to out bytes.
	MOVRI	CMD,11	;# of output bytes.

OUTL:	MOVMA	I	;Get output byte.
	CALL	OBYTE
	ADR	CMD1	;Add it to cksum.
	MOVAR	CMD1
	INCR	I
	DJNZ	CMD,OUTL

	MOVRA	CMD1
	CPLA
	INCA
	CALL	OBYTE	;Output check sum.

	JMP	INWAI	;Loop back to input wait.

; Output Acc. to SI/O line
OBYTE:	MOVRI	K,11	;# of bits -1
	CLRC
	ROLC		;Start bit
OLOOP:	OUTP	TT	;Output bit
	RORC
	MOVRI	N,TBIT-3	;TBIT - Itime.

OWAIT:	DJNZ	N,OWAIT
	DJNZ	K,OLOOP

	ORPI	TT,377	;Stop bit.
	MOVRI	N,TBIT-10	;TBIT - Itime.
SWAIT:	DJNZ	N,SWAIT
	RORC
	RET
WLED:	OUTB	;Latch A on bus.
	MOVI	7	;NOT led E bit.
	ANPA	JS	;NOT E.
	CPLA
	ORPA	JS	;E.

	RET

;Clear leds
CLED:	MOVRI	N,370
	MOVRA	N	;Setup regs.
CLRL:	CALL	WLED	;Clear led loop.
	INCR	N	;Next led.
	MOVRA	N
	JNZ	CLRL

	RET

;Convert channel and wait.
CONVRT:	ORPI	S,100	;STRT.
	ANPI	S,277	;NOT STRT.

	MOVI	=22	;=172 micro seconds?
CONL:	DECA	;Convert wait.
	JNZ	CONL
	MOVXMA	K	;Get A/D output.
	MOVXMA	K	;Twice for bus unlatch.
	OUTB	;Latch bus for output.
	RET

;Alfa led output routines.
CALED:	CLRA	;Blank string index.

OALFA:	MOVAR	I	;Save string index.
	MOVI	376	;NOT CE0.

CENBL:	MOVRI	N,4	;# of chrs in I.C.
	MOVAR	K	;Save CE.
	MOVAX	CEW	;NOT CE.

CHRL:	MOVRA	I
	MOVP3	;A ← String(chr).
	OUTB	;Latch bus output.

	MOVI	367
	ANPA	CEW	;NOT W.
	CPLA
	ORPA	CEW	;W

	INCR	I	;CHR ← CHR+1.
	DJNZ	N,CHRL

	MOVRA	K
	ROL	;Next CE.
	JBS	3,CENBL

	ORPA	CEW	;CE.

	RET

; Bit spreading table
   LOC 1000	;1000 = Start of page two.
	125 ↔ 124 ↔ 121 ↔ 120 ↔ 105 ↔ 104 ↔ 101 ↔ 100
	 25 ↔  24 ↔  21 ↔  20 ↔   5 ↔   4 ↔   1 ↔   0
   SBITS ← 60	;Scan bits.
   ROW0 ← 357	;Scan row 0.
   ROW1 ← 337	;Scan row 1.

SCAN:	SRB1	;Select ram bank 1.
	CPLF0		;Reset scan flag.
	ORPI	S,SBITS	;Turn off rows
	ANPI	S,ROW0	;Enable row 0.
	INP	TT	;Scan row 0
	MOVAR	SW0	;Save it
	ANI	17	;Get low nibble
	MOVPD		;Get bits from spread table
	XCHR	SW0
	SWAP		;Swap high low nibbles
	ANI	17	;Get high nibble 
	MOVPD
	MOVAR	SW1

	ORPI	S,SBITS	;Turn off row 0.
	ANPI	S,ROW1	;Enable row 1.
	INP	TT	;Scan row 1
	ORPI	S,SBITS	;Disable scan.
	MOVAR	SW2	;Save row 1
	ANI	17	;Low nibble
	MOVPD
	ROL		;Shift + bits
	ORR	SW0	;Or into - bits
	ANI	374	;Clear teach and off bits.
	MOVAR	SW0
	MOVRA	SW2	;Get row 1 again
	SWAP
	ANI	17
	MOVPD
	ROL
	ORR	SW1
	MOVAR	SW1

	MOVXA	PBL	;Get push buttons.
	MOVAR	SW2	;Save low nibble.
	MOVXA	PBH
	SWAP	;High nibble.
	ORR	SW2

	CPLA
	MOVAR	SW2
	ANI	77	;Zero JS and P/O bits.
	XCHR	SW2
	ROLC		;Shift & swap teach & off bits
	ROL
	ROLC
	ANI	3
	ORR	SW0
	MOVAR	SW0
GETJSW:	MOVRI	P,P1
	MOVRI	K,0
	MOVRI	N,4
RCAL:	MOVMA	P	;A ← CAL POT.
	ROLC
	MOVRA	K
	ROLC
	MOVAR	K
	INCR	P	;P ← P + 2.
	INCR	P
	DJNZ	N,RCAL

	MOVRI	P,P2
	MOVRI	O,P1
	MOVRI	N,3

CALMP:	MOVMA	P
	MOVAM	O
	INCR	P	;P ← P + 2.
	INCR	P
	INCR	O
	DJNZ	N,CALMP

	MOVRI	P,JW0
	MOVRA	K
	MOVAM	P	;JW0 ← CAL SIGN BITS.
	SRB0	;Select ram bank 0.
	JMP	CKJSC
;Alfa led message table.
   LOC 1400	;Start of page three.

(" "∧77)∨300 ↔ (" "∧77)∨200 ↔ (" "∧77)∨100
" "∧77 ↔ (" "∧77)∨300 ↔ (" "∧77)∨200
(" "∧77)∨100 ↔ " "∧77 ↔ (" "∧77)∨300
(" "∧77)∨200 ↔ (" "∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("L"∧77)∨300 ↔ ("I"∧77)∨200 ↔ ("M"∧77)∨100
"I"∧77 ↔ ("T"∧77)∨300 ↔ (" "∧77)∨200
("S"∧77)∨100 ↔ "T"∧77 ↔ ("O"∧77)∨300
("P"∧77)∨200 ↔ (" "∧77)∨100 ↔ "1"∧77
0 ↔ 0 ↔ 0 ↔ 0

("L"∧77)∨300 ↔ ("I"∧77)∨200 ↔ ("M"∧77)∨100
"I"∧77 ↔ ("T"∧77)∨300 ↔ (" "∧77)∨200
("S"∧77)∨100 ↔ "T"∧77 ↔ ("O"∧77)∨300
("P"∧77)∨200 ↔ (" "∧77)∨100 ↔ "2"∧77
0 ↔ 0 ↔ 0 ↔ 0

("L"∧77)∨300 ↔ ("I"∧77)∨200 ↔ ("M"∧77)∨100
"I"∧77 ↔ ("T"∧77)∨300 ↔ (" "∧77)∨200
("S"∧77)∨100 ↔ "T"∧77 ↔ ("O"∧77)∨300
("P"∧77)∨200 ↔ (" "∧77)∨100 ↔ "3"∧77
0 ↔ 0 ↔ 0 ↔ 0

("L"∧77)∨300 ↔ ("I"∧77)∨200 ↔ ("M"∧77)∨100
"I"∧77 ↔ ("T"∧77)∨300 ↔ (" "∧77)∨200
("S"∧77)∨100 ↔ "T"∧77 ↔ ("O"∧77)∨300
("P"∧77)∨200 ↔ (" "∧77)∨100 ↔ "4"∧77
0 ↔ 0 ↔ 0 ↔ 0

("L"∧77)∨300 ↔ ("I"∧77)∨200 ↔ ("M"∧77)∨100
"I"∧77 ↔ ("T"∧77)∨300 ↔ (" "∧77)∨200
("S"∧77)∨100 ↔ "T"∧77 ↔ ("O"∧77)∨300
("P"∧77)∨200 ↔ (" "∧77)∨100 ↔ "5"∧77
0 ↔ 0 ↔ 0 ↔ 0

("L"∧77)∨300 ↔ ("I"∧77)∨200 ↔ ("M"∧77)∨100
"I"∧77 ↔ ("T"∧77)∨300 ↔ (" "∧77)∨200
("S"∧77)∨100 ↔ "T"∧77 ↔ ("O"∧77)∨300
("P"∧77)∨200 ↔ (" "∧77)∨100 ↔ "6"∧77
0 ↔ 0 ↔ 0 ↔ 0

("L"∧77)∨300 ↔ ("I"∧77)∨200 ↔ ("M"∧77)∨100
"I"∧77 ↔ ("T"∧77)∨300 ↔ (" "∧77)∨200
("S"∧77)∨100 ↔ "T"∧77 ↔ ("O"∧77)∨300
("P"∧77)∨200 ↔ (" "∧77)∨100 ↔ "7"∧77
0 ↔ 0 ↔ 0 ↔ 0
("T"∧77)∨300 ↔ ("O"∧77)∨200 ↔ ("O"∧77)∨100
" "∧77 ↔ ("C"∧77)∨300 ↔ ("L"∧77)∨200
("O"∧77)∨100 ↔ "S"∧77 ↔ ("E"∧77)∨300
(" "∧77)∨200 ↔ (" "∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("T"∧77)∨300 ↔ ("O"∧77)∨200 ↔ ("O"∧77)∨100
" "∧77 ↔ ("F"∧77)∨300 ↔ ("A"∧77)∨200
("R"∧77)∨100 ↔ " "∧77 ↔ (" "∧77)∨300
(" "∧77)∨200 ↔ (" "∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("T"∧77)∨300 ↔ ("E"∧77)∨200 ↔ ("A"∧77)∨100
"C"∧77 ↔ ("H"∧77)∨300 ↔ (" "∧77)∨200
("M"∧77)∨100 ↔ "O"∧77 ↔ ("D"∧77)∨300
("E"∧77)∨200 ↔ (" "∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("M"∧77)∨300 ↔ ("A"∧77)∨200 ↔ ("N"∧77)∨100
"U"∧77 ↔ ("A"∧77)∨300 ↔ ("L"∧77)∨200
(" "∧77)∨100 ↔ "M"∧77 ↔ ("O"∧77)∨300
("D"∧77)∨200 ↔ ("E"∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("N"∧77)∨300 ↔ ("O"∧77)∨200 ↔ (" "∧77)∨100
"H"∧77 ↔ ("I"∧77)∨300 ↔ ("G"∧77)∨200
("H"∧77)∨100 ↔ " "∧77 ↔ ("P"∧77)∨300
("W"∧77)∨200 ↔ ("R"∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("P"∧77)∨300 ↔ ("R"∧77)∨200 ↔ ("O"∧77)∨100
"G"∧77 ↔ (" "∧77)∨300 ↔ ("R"∧77)∨200
("U"∧77)∨100 ↔ "N"∧77 ↔ ("N"∧77)∨300
("I"∧77)∨200 ↔ ("N"∧77)∨100 ↔ "G"∧77
0 ↔ 0 ↔ 0 ↔ 0

("R"∧77)∨300 ↔ ("U"∧77)∨200 ↔ ("N"∧77)∨100
" "∧77 ↔ ("H"∧77)∨300 ↔ ("O"∧77)∨200
("L"∧77)∨100 ↔ "D"∧77 ↔ (" "∧77)∨300
(" "∧77)∨200 ↔ (" "∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("F"∧77)∨300 ↔ ("A"∧77)∨200 ↔ ("T"∧77)∨100
"A"∧77 ↔ ("L"∧77)∨300 ↔ (" "∧77)∨200
("E"∧77)∨100 ↔ "R"∧77 ↔ ("R"∧77)∨300
("O"∧77)∨200 ↔ ("R"∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

   LOC 2272
	0	;This is for a block of zeros
END